package br.academia.arq.dao;

import java.util.Collection;
import java.util.HashMap;

import org.hibernate.HibernateException;
import org.hibernate.Query;

import br.academia.arq.erros.DAOException;
import br.academia.dominio.Estado;
import br.academia.dominio.ExercicioTreino;
import br.academia.dominio.Treino;
import br.academia.util.Validador;


/**
 * Dao com operações referentes a ExercicioTreino
 * @see Estado
 */
public class ExercicioTreinoDAO extends GenericDAO{
	
	/**
	 * Método que retorna uma entidade do classe ExercicioTreino que possua o
	 * nome idêntico ao nome passado como parâmetro
	 * @param nome
	 * @return
	 * @throws HibernateException
	 * @throws DAOException
	 */
	public ExercicioTreino findExercicioTreinoByTreino(Treino treino) throws HibernateException, DAOException{
		String hql = "select a from ExercicioTreino a where a.treino.id = :treino ";
		
		Query q = getSession().createQuery(hql);
		
		q.setParameter("treino", treino.getId());
		
		ExercicioTreino exercicioTreino = (ExercicioTreino) q.uniqueResult();
		
		return exercicioTreino;
	}
	
	/**
	 * Método que retorna uma lista de ExercicioTreino que possuam a série
	 * passada como parâmetro
	 * @param treino
	 * @return
	 * @throws HibernateException
	 * @throws DAOException
	 */
	public Collection<ExercicioTreino> findExerciciosByTreino(Treino treino) throws HibernateException, DAOException{
		String hql = "select a from ExercicioTreino a where a.treino.id = :treino ";
		
		Query q = getSession().createQuery(hql);
		
		q.setParameter("treino", treino.getId());

		@SuppressWarnings("unchecked")
		Collection<ExercicioTreino> exercicioTreinos = q.list();
		
		return exercicioTreinos;
	}
	
	/**
	 * Método que retorna itens que tenham nome ou descrição parecidos
	 * com os itens do ideal passado como parâmetro
	 * @param ideal
	 * @return
	 * @throws HibernateException
	 * @throws DAOException
	 */
	public Collection<ExercicioTreino> findExercicioTreinoLike(ExercicioTreino exercicioTreino) throws HibernateException, DAOException{
		String hql = "select a from ExercicioTreino a where 1 = 1 ";
		HashMap<String, Object> parametros = new HashMap<String, Object>();
		
		if(!Validador.isEmpty(exercicioTreino.getTreino())){
			hql += " and a.treino.id = :treino ";
			parametros.put("treino", exercicioTreino.getTreino().getId());
		}
		
		if(!Validador.isEmpty(exercicioTreino.getTreino())){
			hql += " and a.exercicio.id = :exercicio ";
			parametros.put("exercicio", exercicioTreino.getExercicio().getId());
		}
		
		Query q = getSession().createQuery(hql);
		
		setParametros(parametros, q);
		
		@SuppressWarnings("unchecked")
		Collection<ExercicioTreino> exercicioTreinos = q.list();
		
		return exercicioTreinos;
	}
}
